package com.unitechs.trap.excel.webapi.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.springframework.stereotype.Service;

import java.io.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Slf4j
public class FileUtil {
    public static final String LOG_TO_EXCEL_URL="G:\\trap规则整理\\UDP数据\\2、Log转Excel";

    /**
     * 读取文件中数据
     * 将以<<<<END>>>>结尾的每条数据存入Excel
     *
     * @param file File类型文件
     * @return 读取出来的list集合
     */
    public static List<String> readLogFromFile(File file) {
        List<String> dataList = new ArrayList<>();

        try {
            // 创建一个文件输入流对象
            FileInputStream inputStream = new FileInputStream(file);

            // 创建一个字符缓冲流对象
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

            // 创建一个StringBuilder对象，用于存储文件内容
            StringBuilder stringBuilder = new StringBuilder();

            // 读取文件内容，并添加到StringBuilder中
            String line;
            while ((line = reader.readLine()) != null) {
                stringBuilder.append(line);
            }

            // 将StringBuilder转换为字符串
            String fileContent = stringBuilder.toString();

            Pattern pattern = Pattern.compile("(?<=^|<<<<END>>>>)(?<value>.*?)(?=<<<<END>>>>)", Pattern.DOTALL);
            Matcher matcher = pattern.matcher(fileContent);
            while (matcher.find()) {
                String value = matcher.group("value");
                dataList.add(value);
            }
            // 关闭输入流和字符缓冲流
            reader.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        log.info("集合长度{}", dataList.size());
        return dataList;
    }

    /**
     * 将List集合中的数据写入到第一列
     * 并将TrapOid写到第二列
     * @param dataList String类型的集合
     */
    public static void outLogAndOidToExcelCell(List<String> dataList) {
        try {
            int rowNum = 0;
            HSSFWorkbook workbook = new HSSFWorkbook(); // 创建一个新的Excel文件
            HSSFSheet sheet = workbook.createSheet("Data"); // 创建一个名为"Data"的工作表
            for (int i = 0; i < dataList.size(); i++) {
                Row row = sheet.createRow(rowNum);
                Cell cell = row.createCell(0); // 将数据存入表格第一列
                cell.setCellValue(dataList.get(i));
                cell= row.createCell(1);

                Pattern pattern = Pattern.compile(".*OID:\\s*(?<value>[^\\s]+).*");
                Matcher matcher = pattern.matcher(dataList.get(i));
                if (matcher.find()){
                    cell.setCellValue(matcher.group("value"));
                }

                if (rowNum++ >= 30000) {
                    FileOutputStream outputStream = new FileOutputStream(LOG_TO_EXCEL_URL+"\\" + UUID.randomUUID() + ".xls"); // 将Excel文件保存到磁盘中
                    workbook.write(outputStream);
                    workbook.close();
                    workbook = new HSSFWorkbook(); // 创建一个新的Excel文件
                    sheet = workbook.createSheet("Data"); // 创建一个名为"Data"的工作表
                    rowNum=0;
                }
            }

            FileOutputStream outputStream = new FileOutputStream(LOG_TO_EXCEL_URL+"\\" + UUID.randomUUID() + ".xls"); // 将Excel文件保存到磁盘中
            workbook.write(outputStream);
            workbook.close();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 获取指定文件夹中的所有文件
     *
     * @param folder File类型
     * @return 含路径的所有文件集合
     */
    public static List<File> getAllFiles(File folder) {
        List<File> fileList = new ArrayList<>();
        if (folder.isDirectory()) {
            File[] files = folder.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isDirectory()) {
                        fileList.addAll(getAllFiles(file));
                    } else {
                        fileList.add(file);
                    }
                }
            }
        }
        return fileList;
    }

    /**
     * 获取指定文件夹中的所有非路径文件
     *
     * @param folder
     * @return 非路径的文件集合
     */
    public static List<File> getNonDirectoryFiles(File folder) {
        List<File> fileList = getAllFiles(folder);
        List<File> nonDirectoryFiles = new ArrayList<>();
        for (File file : fileList) {
            if (!file.isDirectory()) {
                nonDirectoryFiles.add(file);
            }
        }
        return nonDirectoryFiles;
    }

}
